package com.lry.provider.impl;


import com.lry.pojo.User;
import com.lry.service.UserService;
import org.apache.dubbo.config.annotation.DubboService;
import org.apache.dubbo.rpc.RpcContext;
import org.springframework.util.StringUtils;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.*;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import java.util.HashMap;
import java.util.Map;

/**
 * @author JiangJie
 * @create 2020-12-02 16:02
 */
@Path("users")
@DubboService//(validation = "true")
public class UserServiceImpl implements UserService {

    /**
     * 在一般应用中，我们建议将javax.ws.rs.* annotation放到服务实现类，这样annotation和java实现代码位置更接近，更便于开发和维护。另外更重要的是，我们一般倾向于避免对接口的污染，保持接口的纯净性和广泛适用性。
     * 但是，如后文所述，如果我们要用dubbo直接开发的消费端来访问此服务，则annotation必须放到接口上。
     * 如果接口和实现类都同时添加了annotation，则实现类的annotation配置会生效，接口上的annotation被直接忽略
     */
    Map<Integer, User> users = new HashMap<>();

    //POST 增改，GET 查删
    @POST
    @Path("register")
    @Consumes({MediaType.APPLICATION_JSON})
    public void addUser(User user) {
        if (null == user || null == user.getId())
            return;
        users.put(user.getId(), user);
    }

    @GET
    @Path("{id : \\d+}")//\d+正则表示id为数字
    @Produces({MediaType.APPLICATION_JSON})
    public User getUser(@PathParam("id") Integer id) {
        return users.get(id);
    }

    @GET
    @Path("getUser/{id : \\d+}")//\d+正则表示id为数字
    @Produces({MediaType.APPLICATION_JSON})
    public User getUser1(@PathParam("id") Integer id,@Context HttpServletRequest request) {
        System.out.println("Client address is " + request.getRemoteAddr());
        System.out.println("Client address is " + RpcContext.getContext().getRemoteAddressString());
        System.out.println(RpcContext.getContext().getRequest(HttpServletRequest.class));
        System.out.println(RpcContext.getContext().getRequest(HttpServletResponse.class));
        return users.get(id);
    }

    //方法必须在接口里有定义，否则调不通
    @GET
    @Path("getUser2/{id : \\d+}")//\d+正则表示id为数字
    @Produces({MediaType.APPLICATION_JSON})
    public User getUser2(@PathParam("id") Integer id) {
        System.out.println("Client address is " + RpcContext.getContext().getRemoteAddressString());
        return users.get(id);
    }

}
